home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD ROM Paradise Collection 4
/
CD ROM Paradise Collection 4 1995 Nov.iso
/
win
/
pasock10.zip
/
FINGERD.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-11-16
|
8KB
|
253 lines
{
Public Domain - Please leave this notice intact.
Mike Caughran Cedar Island Software OCT 1994
All the usual disclaimers apply.
Implement a finger daemon using Borland Pascal 7
71034.2371@compuserve.com
907-789-9030 voice
907-789-1694 bbs
}
{
Fingerd is one of the easiest servers to implement and
demonstrates how to use sockets clearly.
WinCRT is used also for clarity. (Eschew Obfuscation.)
Finger usually resides on socket 79.
Usage: Install a TCP/IP stack with associated WINSOCK.DLL.
If you have no TCP/IP stack, then get TRUMPET.
Start fingerd.exe from Windows and leave running.
Telnet to the host running fingerd. (use port 79
instead of the standard telnet port 23)
Press enter on the telnet client and you should
see the finger information sent back to you.
Or you can use the finger client supplied to connect
with the finger daemon.
}
program fingerd;
uses winsock, strings, wincrt, winprocs, wintypes;
var
myVerReqd : word;
myWSAData : WSADATA;
s : String[255];
i : integer;
CharArray: array[0..255] of char;
HostNameArray: array[0..255] of char;
FingerSocket, AcceptSocket : tSOCKET;
err : integer;
FingerPort : word;
Remote_Addr: sockaddr_in;
Remote_Host: Phostent;
procedure CleanUp; Forward;
{$I ERROR.INC}
{----------------------------------------}
{ -- Start of code to SubClass WinCRT -- }
{----------------------------------------}
var
OldWndProc : TFarProc;
const
hCRTWnd : HWND = 0;
cm_Exit = 100;
cm_About = 101;
USER_CONNECT = WM_USER + 100;
USER_READ = WM_USER + 101;
var
ThisLen : integer;
ThisAddr : sockaddr;
Buff : array [0..1024] of char;
ReadCount,Readindex : Integer;
function WindowProc(Window:HWnd; Message,wParam:Word; lParam:LongInt) : LongInt; export;
begin
case Message of
wm_Char : begin
if wParam=vk_Escape then begin
CleanUp;
DoneWinCRT;
end;
end;
wm_Command : begin
case WParam of
cm_About: MessageBox(Window,
'Finger Daemon'#13'Public Domain 1994 by'#13'Mike Caughran'#13'Cedar Island Software',
'Pascal Finger Daemon',mb_IconQuestion);
cm_Exit: begin
CleanUp;
DoneWinCrt;
end;
end;
end;
USER_CONNECT : begin
writeln('Received a USER_CONNECT message');
if (WSAGetSelectError(lparam) <> 0) then Error('USER_CONNECT msg')
else begin
ThisLen := SizeOf(Remote_Addr);
ThisAddr := SockAddr(Remote_Addr);
AcceptSocket := accept(FingerSocket, @ThisAddr, @ThisLen);
writeln('AcceptSocket=',acceptSocket);
if AcceptSocket=INVALID_SOCKET then Error('AcceptSocket')
else WSAAsyncSelect(AcceptSocket, hCRTWnd, USER_READ, FD_READ);
end;
end;
USER_READ : begin
writeln('Received a USER_READ message');
ReadCount := recv(AcceptSocket, Buff, 1024, 0);
if ReadCount = SOCKET_ERROR then Error('Read')
else begin
writeln('Characters received:');
for ReadIndex := 0 to ReadCount do Write(Buff[ReadIndex]);
strCopy(Buff,'Hello from fingerd world'#0);
if (Send(AcceptSocket,Buff,strlen(Buff),0) < strlen(Buff))
then error('Send');
end;
closesocket(AcceptSocket);
end;
end;
WindowProc := CallWindowProc(OldWndProc, Window, Message, wParam, lParam);
end;
procedure MakeMenu;
var
Menu : HMenu;
FileMenu : HMenu;
begin
Menu := CreateMenu;
FileMenu := CreateMenu;
AppendMenu(Menu, mf_PopUp or mf_Enabled, FileMenu, 'File');
AppendMenu(FileMenu, mf_Enabled, cm_Exit, 'Exit');
AppendMenu(Menu, mf_Enabled, cm_About, 'About');
SetMenu(hCRTWnd,Menu);
end;
procedure myInitWinCRT;
var
hInstance : THandle;
WindowClass : TWndClass;
begin
GetClassInfo(hInstance, 'TPWinCrt' ,WindowClass);
UnregisterClass('TPWinCRT', hInstance);
WindowClass.hIcon := LoadIcon(0, idi_Question);
WindowClass.hCursor := LoadCursor(0, idc_Arrow);
OldWndProc := tFarProc(WindowClass.lpfnWndProc);
WindowClass.lpfnWndProc := @WindowProc;
RegisterClass(WindowClass);
InactiveTitle := '%s';
StrCopy(WindowTitle,'Pascal Finger Daemon V1.0');
InitWinCrt;
hCRTWnd := GetActiveWindow;
MakeMenu;
end;
{--------------------------------------}
{ -- End of code to SubClass WinCRT -- }
{--------------------------------------}
procedure StartUp;
begin
myVerReqd:=$0101;
Writeln('Winsock version required : ',hibyte(myVerReqd),'.',lobyte(myVerReqd));
if WSAStartup(myVerReqd,@myWSAData) <>0 then Abort('WSAStartup');
end;
procedure ShowWinSockInfo;
begin
Write('Winsock Version found: ');
Writeln(lobyte(myWSAData.wVersion),'.',lobyte(myWSAData.wHighVersion));
S := StrPas(myWSAData.szDescription);
Writeln('Description=',S);
S := StrPas(myWSAData.szSystemStatus);
Writeln('SystemStatus=',S);
Writeln('MaxSockets=',word(myWSAData.iMaxSockets));
Writeln('MaxUdpDg=',word(myWSAData.iMaxUdpDg));
Write('VendorInfo= ');
if myWSAData.lpVendorInfo <> NIL then begin
writeln(myWSAData.lpVendorInfo);
end else writeln('NULL');
Write('Local Hostname=');
if (gethostname(@CharArray,255) <> 0) then Error('GetHostName')
else writeln(CharArray);
end;
procedure FindFingerService;
var
pSE : pServEnt;
begin
FingerPort := 0;
pSE := getservbyname('finger','tcp');
if pSE = nil then begin
Error('GetServByName'); Writeln;
Writeln('Finger is usually on port 79. Check Services table.');
end
else begin
FingerPort := htons(pSE^.s_port);
Writeln('Using finger service on port ',FingerPort);
end;
end;
procedure CreateSocket;
begin
FingerSocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
If FingerSocket = INVALID_SOCKET then Abort('Can''t CreateSocket')
else
Writeln('Socket descriptor allocated : ',ord(FingerSocket));
end;
procedure BindToSocket;
begin
Remote_addr.sin_family := PF_INET;
Remote_addr.sin_port := htons(FingerPort);
Remote_addr.sin_addr.s_addr:=INADDR_ANY;
if bind(FingerSocket, sockaddr(Remote_Addr), SizeOf(Remote_Addr)) <> 0 then
begin
CloseSocket(FingerSocket);
Abort('Bind');
end;
end;
procedure ListenToSocket;
var
rc : integer;
begin
rc := listen(FingerSocket,5);
if rc > 0 then Error('Listen');
rc := rc + WSAAsyncSelect(FingerSocket, hCRTWnd, USER_CONNECT, FD_ACCEPT);
if rc > 0 then begin
CloseSocket(FingerSocket);
Abort('WSAAsyncSelect');
end;
end;
procedure CleanUp;
begin
if WSACleanup <> 0 then Error('WSACleanup');
end;
procedure DoFingerd;
begin
StartUp;
ShowWinsockInfo;
FindFingerService;
CreateSocket;
BindToSocket;
ListenToSocket;
end;
begin
MyInitWinCRT;
DoFingerd;
end.